package cn.yougou.config;
import cn.yougou.common.EmptyUtils;
import cn.yougou.pojo.YgUser;
import com.alibaba.fastjson.JSON;
import cn.yougou.common.RedisUtils;
import cn.yougou.exception.AuthException;
import cn.yougou.vo.YgUserInfoVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;


/**
 * 登录拦截器
 *
 * @author kups
 * 2020-12-20
 * 参考博客：https://blog.csdn.net/LitongZero/article/details/88177716
 */
public class AuthenticationInterceptor implements HandlerInterceptor {

    /*public final static String ACCESS_TOKEN = "token";

    @Autowired
    private RedisUtils redisUtils;

    // 在业务处理器处理请求之前被调用
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        Class  c=handlerMethod.getBeanType();

        // 判断接口是否需要登录
        LoginRequired methodAnnotation = method.getAnnotation(LoginRequired.class);
        if(methodAnnotation==null){
            //为了适配类上使用该注解
            methodAnnotation= (LoginRequired) c.getAnnotation(LoginRequired.class);
        }
        // 有 @LoginRequired 注解，需要认证
        if (methodAnnotation != null) {
            // 判断是否存在令牌信息，如果存在，则允许登录
            String accessToken = request.getHeader(ACCESS_TOKEN);
            if (accessToken == null) {
                throw new AuthException("40001", "需要登录");
            } else {
                // 从Redis中获取用户信息
                YgUser ygUser = JSON.parseObject(redisUtils.get(Constants.USER_TOKEN + accessToken), YgUser.class);
                if (EmptyUtils.isNotEmpty(ygUser)) {
                    // 当前登录用户@CurrentUser
                    request.setAttribute("YgUser", ygUser);
                } else {
                    // 用户信息有问题，不予登录
                    throw new AuthException("40002", "token失效");
                }
                return true;
            }

        } else {
            //不需要登录可请求
            return true;
        }
    }

    // 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    // 在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }*/

}
